#ifndef __CLX_HOTMANAGER_HPP__
#define __CLX_HOTMANAGER_HPP__

#include "util.hpp"
#include "config.hpp"
#include "data.hpp"

extern clx_cloud::DataManager *_data;

namespace clx_cloud {
    class HotManager {
        private:
            std::string _back_dir;      //  备份文件路径
            std::string _pack_dir;      //  压缩文件路径
            std::string _pack_suffix;   //  压缩包后缀名
            int _hot_time;              //  热点判断时间
        private:
            // 非热点文件饭返回真 热点文件返回假
            bool HotJudge(const std::string &filename) {
                FileUtil fu(filename);
                time_t last_atime = fu.LastATime();
                time_t curr_time = time(NULL);
                if (curr_time - last_atime > _hot_time) {
                    return true;
                }
                return false;
            }
        public:
            HotManager() {
                Config *config = Config::GetInstance();
                _back_dir = config->GetBackDir();
                _pack_dir = config->GetPackDir();
                _pack_suffix = config->GetPackFileSuffix();
                _hot_time = config->GetHotTime();
                FileUtil tmp1(_back_dir);
                FileUtil tmp2(_pack_dir);
                tmp1.CreateDirectory();
                tmp2.CreateDirectory();
            }
            bool RunModule()  {
                while (1) {
                    // 1、遍历备份目录，获取所有文件名
                    FileUtil fu(_back_dir);
                    std::vector<std::string> array;
                    fu.ScanDirectory(&array);
                    // 2、遍历判断文件是否是热点文件
                    for (auto &a : array)
                    {
                        if (HotJudge(a) == false)
                        {
                            continue; // 热点文件不需要特别处理
                        }
                        // 3、获取文件备份信息
                        BackupInfo bi;
                        if (_data->GetOneByRealpath(a, &bi) == false)
                        {
                            // 先在有文件存在，但是没有备份信息
                            bi.NewBackupInfo(a);
                        }
                        // 4、对非热点文件进行压缩处理
                        FileUtil tmp(a);
                        tmp.Compress(bi.pack_path);
                        // 4、删除源文件，修改备注信息
                        tmp.Remove();
                        bi.pack_flag = true;
                        _data->Update(bi);
                        sleep(1);
                    }
                }
                return true;
            }
    };
}

#endif